<%@page import="javax.sql.DataSource"%>
<%@page import="javax.naming.InitialContext"%>
<%@page import="javax.naming.Context"%>
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.PreparedStatement"%>
<%@page import="java.sql.Connection"%>
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"
		 trimDirectiveWhitespaces="true"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Insert title here</title>
</head>
<body>
<h1> 데이터베이스 커넥션 풀 01</h1>
<p>자바 프로그램 실행 시 비용이 많이 소모되는 부분은 객체 생성/소멸, 입출력 처리 작업임.</p>
<p> JDBC프로그램에서는 DB관련 작업시 연결객체를 생성하고, 소멸하는 작업이 빈번하게 일어나는데,<br/>
접속자 수가 많으면 실행시간이 많-이 지연됨.</p>
<p> 따라서, 연결객체를 만들고 사용한 후, 바로 객체를 소멸시키지 말고 이 객체를 저장하는 저장소pool에 일시적으로 보관했다가,<br/>
	다른 사용자가 사용해야 하는 경우 객체를 다시 생성하지 말고, 기존에 생성해둔 객체를 재 사용하게 함.</p>
<p> 일정시간도안 더 이상 사용하는 사람이 없으면 그때서야 객체를 소멸시킴 </p>

<h3>설치방법</h3>
<p>1) apache프로젝트의 DBCP 라이브러리 이용<br/>
	  commons-dbcp-xxx.jar, commons-pool-xxx.jar<br/>
	  성능은 좋지만, 설치가 번거로움.</p>
<p>2) JSP/Servlet 컨테이너에 내장된 DBCP 이용<br/>
	  다양한 설치방법 제공, 성능은 무난(추천!) </p>

<h3>설치방법</h3>
<p>DBCP 접속정보는 datasource 형태로 작성해야 함.</p>
<p>1) conf/server.xml에 context 태그 속 resource 태그로 작성 땡땡24와 같은 웹호스팅 업체를 이용하는 경우, 
	  이 방식을 사용해서 커넥션 풀을 써야 함.</p>
<p>2) 프로젝트 마다 META-INF/context.xml의 context태그 속 resource태그로 작성</p>


<h3>중요! datasource / JNDI</h3>
<p> 커넥션 풀을 사용하려면 DB접속 정보를 설정해야 하는데 이것을 datasource라 하고, 
	이것을 JNDL표기법을 이용해서 정의 함.</p>
<p>JNDI - java naming and directory interface는 자바로 작성한 프로그램에서 
		   네트워크를 통해 모든 자원의 위치를 파악하고 필요시 그것을 쉽게 호출하기 위해 사용하는 규칙</p>
<p>JNDI는 J2EE표준이고, DBCP는 이것을 이용하여 처리하도록 가이드라인이 정해져 있음.</p>
<p>JSP/Servlet 컨테이너마다 규칙이 조금씩 다름 </p>
<p>tomcat에서는 java:/comp/env로 jndi초기화</p>
<p>context.xml에 정의한 datasource중 jdbc/oracle11xe로 정의한 datasource를 이용해서 dbcp 초기화함</p>

<%
	String sql="select * from memberv3 where userid = ?"; 
	Connection conn = null;
	PreparedStatement ps = null;
	ResultSet rs = null;
	String result="";
	
	try{
		//DBCP를 이용해서 Connection 객체 생성 
		//datasource로 정의한 접속정보를 JNDI로 호출함
		Context initCtx = new InitialContext();
		Context envCtx = (Context)initCtx.lookup("java:/comp/env");
		//JNDI 초기화 구문
		DataSource ds = (DataSource)envCtx.lookup("jdbc/oracle11xe");
		//datasource객체 참조
		conn = ds.getConnection(); //연결객체 생성
		
		ps = conn.prepareStatement(sql);
		ps.setString(1,"df");
		rs = ps.executeQuery();
		if(rs.next()){
			result += rs.getString(1)+"/";
			result += rs.getString(2)+"/";
			result += rs.getString(3)+"/";
			result += rs.getString(4)+"/";
			result += rs.getString(5)+"/";
			result += rs.getString(6)+"/";
		}
	}catch(Exception ex){
		ex.printStackTrace();
	}finally{
		if(rs!=null)try{rs.close();}catch(Exception e){}
		if(ps!=null)try{ps.close();}catch(Exception e){}
		if(conn!=null)try{conn.close();}catch(Exception e){}
	}
		out.println(result);
	%>
</body>
</html>